package com.gf.alipay.controller;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.gf.alipay.config.AlipayConfig;
import com.gf.alipay.service.AlipayService;
import com.gf.base.controller.BasicController;
import com.gf.common.constant.Constants;
import com.gf.common.constant.ViewPaths;
import com.gf.common.exception.NotLoginException;
import com.gf.common.util.WebHelper;
import com.gf.common.util.alipay.AlipayNotify;
import com.gf.common.util.alipay.UtilDate;
import com.gf.user.model.User;

/**
 * 支付宝接口
 * 
 * @author zhuguifeng
 * 
 */

@Controller
@RequestMapping("/alipay")
public class AlipayController extends BasicController {

	private Log LOGGER = LogFactory.getLog(AlipayController.class);

	// 默认支付方式
	private String paymethod = "";
	// 默认网银代号
	private String defaultbank = "";

	/**
	 * 充值请求
	 * 
	 * @return
	 */
	@RequestMapping(value = "/alipayIndex", method = RequestMethod.GET)
	public ModelAndView alipayRequest() {
		LOGGER.debug("充值请求");
		ModelAndView mvc = new ModelAndView();

		mvc.setViewName(ViewPaths.ALIPAY_INDEX_VIEW);

		return mvc;
	}

	/**
	 * 充值交易处理
	 * 
	 * @param subject
	 *            标题
	 * @param total_fee
	 *            充值金额
	 * @param alibody
	 *            备注
	 * @param pay_bank
	 *            支付方式
	 * @return
	 * */
	@RequestMapping(value = "/alipayTo", method = RequestMethod.POST)
	public ModelAndView alipayRequest(String subject, double total_fee,
			String alibody, String pay_bank) {

		LOGGER.debug("充值处理");

		User user = WebHelper.getSessionAttribute(null, Constants.SESSION_USER);
		if (user == null) {
			throw new NotLoginException();
		}

		if (pay_bank.equals("directPay")) {
			paymethod = "directPay";
		} else {
			defaultbank = pay_bank;
		}

		// 生成订单号
		String out_trade_no = UtilDate.getOrderNum();
		// 商品展示地址
		String show_url = "";
		// 防钓鱼时间戳
		String anti_phishing_key = "";// AlipayService.query_timestamp();
		// 获取客户端的IP地址，建议：编写获取客户端IP地址的程序
		String exter_invoke_ip = "";// WebHelper.getClientIp(null);
		// 自定义参数，可存放任何内容（除=、&等特殊字符外），不会显示在页面上
		String extra_common_param = "";
		// 提成类型，该值为固定值：10，不需要修改
		String royalty_type = "";
		// 提成信息集
		String royalty_parameters = "";

		// 把请求参数打包成数组
		Map<String, String> sParaTemp = new HashMap<String, String>();
		sParaTemp.put("payment_type", "1");
		sParaTemp.put("out_trade_no", out_trade_no);
		sParaTemp.put("subject", subject);
		sParaTemp.put("body", alibody);
		sParaTemp.put("total_fee", "" + total_fee);
		sParaTemp.put("show_url", show_url);
		sParaTemp.put("paymethod", paymethod);
		sParaTemp.put("defaultbank", defaultbank);
		sParaTemp.put("anti_phishing_key", anti_phishing_key);
		sParaTemp.put("exter_invoke_ip", exter_invoke_ip);
		sParaTemp.put("extra_common_param", extra_common_param);
		sParaTemp.put("buyer_email", AlipayConfig.seller_email);
		sParaTemp.put("royalty_type", royalty_type);
		sParaTemp.put("royalty_parameters", royalty_parameters);

		// 构造函数，生成请求URL,该URL是带有<form>的形式,js控制自动提交访问
		String sHtmlText = AlipayService.create_direct_pay_by_user(sParaTemp);

		ModelAndView mvc = new ModelAndView();
		mvc.addObject("sHtmlText", sHtmlText);
		//mvc.addObject("name", user.getUsername());
		mvc.setViewName(ViewPaths.ALIPAY_TO_VIEW);

		return mvc;
	}

	/**
	 * 充值后<br>
	 * 获取支付宝GET过来反馈信息 要与AlipayConfig 中的return_url相对应
	 * 
	 * @param request
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	@RequestMapping(value = "/return_url", method = RequestMethod.GET)
	public ModelAndView getPayReturnUrlResult(HttpServletRequest request)
			throws UnsupportedEncodingException {
		// 获取支付宝GET过来反馈信息
		Map<String, String> params = AlipayService.getParams(request);

		// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//

		String trade_no = request.getParameter("trade_no"); // 支付宝交易号
		String order_no = request.getParameter("out_trade_no"); // 获取订单号
		String total_fee = request.getParameter("total_fee"); // 获取总金额
		String subject = new String(request.getParameter("subject").getBytes(
				"ISO-8859-1"), "utf-8");// 商品名称、订单名称
		String body = "";
		if (request.getParameter("body") != null) {
			body = new String(request.getParameter("body").getBytes(
					"ISO-8859-1"), "utf-8");// 商品描述、订单备注、描述
		}
		String buyer_email = request.getParameter("buyer_email"); // 买家支付宝账号
		String trade_status = request.getParameter("trade_status"); // 交易状态

		// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

		// 计算得出通知验证结果
		boolean verify_result = AlipayNotify.verify(params);

		if (verify_result) {// 验证成功
			// ////////////////////////////////////////////////////////////////////////////////////////
			// 请在这里加上商户的业务逻辑程序代码

			// ——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

			if (trade_status.equals("TRADE_FINISHED")
					|| trade_status.equals("TRADE_SUCCESS")) {
				// 判断该笔订单是否在商户网站中已经做过处理
				// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				// 如果有做过处理，不执行商户的业务程序
			}

			// ——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

		} else {
			// 该页面可做页面美工编辑
			// out.println("验证失败");
		}

		ModelAndView mvc = new ModelAndView();
		mvc.setViewName(ViewPaths.ALIPAY_RETURN_URL_VIEW);
		mvc.addObject("verify_result", verify_result);
		return mvc;
	}

	/**
	 * 付款的异步通知处理
	 * 
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	@RequestMapping(value = "/notify_url", method = RequestMethod.POST)
	public String getPayNitifyUrlResult(HttpServletRequest request)
			throws UnsupportedEncodingException {
		// 获取支付宝POST过来反馈信息
		Map<String, String> params = AlipayService.getParams(request);

		String trade_no = request.getParameter("trade_no"); // 支付宝交易号
		String order_no = request.getParameter("out_trade_no"); // 获取订单号
		String total_fee = request.getParameter("total_fee"); // 获取总金额
		String subject = new String(request.getParameter("subject").getBytes(
				"ISO-8859-1"), "utf-8");// 商品名称、订单名称
		String body = "";
		if (request.getParameter("body") != null) {
			body = new String(request.getParameter("body").getBytes(
					"ISO-8859-1"), "utf-8");// 商品描述、订单备注、描述
		}
		String buyer_email = request.getParameter("buyer_email"); // 买家支付宝账号
		String trade_status = request.getParameter("trade_status"); // 交易状态

		// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

		if (AlipayNotify.verify(params)) {// 验证成功
			// ////////////////////////////////////////////////////////////////////////////////////////
			// 请在这里加上商户的业务逻辑程序代码

			// ——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

			if (trade_status.equals("TRADE_FINISHED")) {
				// 判断该笔订单是否在商户网站中已经做过处理
				// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				// 如果有做过处理，不执行商户的业务程序

				// 注意：
				// 该种交易状态只在两种情况下出现
				// 1、开通了普通即时到账，买家付款成功后。
				// 2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
			} else if (trade_status.equals("TRADE_SUCCESS")) {
				// 判断该笔订单是否在商户网站中已经做过处理
				// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				// 如果有做过处理，不执行商户的业务程序

				// 注意：
				// 该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
			}

			// ——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

			return "success"; // 请不要修改或删除
		} else {// 验证失败
			return "fail";
		}
	}

}
